package main

//gorm的字段标签
//https://blog.csdn.net/weixin_40626064/article/details/119242905
import (
	"errors"
	"fmt"
	"github.com/go-basic/uuid"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

func GetDb() *gorm.DB {
	db, _ := gorm.Open(mysql.New(mysql.Config{
		DSN: "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",
		//DSN:               "root:123@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local",
		DefaultStringSize: 256, // string 类型字段的默认长度(必须要进行配置，否则新增string字段会字段变成longtext类型)
	}), &gorm.Config{
		//外键约束
		DisableForeignKeyConstraintWhenMigrating: true,
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "t_", // 表名前缀，`User` 的表名应该是 `t_users`
			SingularTable: true, // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `t_user`
		},
		// 全局模式，所有的操作都会创建并缓存预编译语句，以加速后续执行速度
		PrepareStmt: true,
	})
	return db
}

type Person struct {
	Name string `gorm:"check:name_checker,name <> 'jinzhu',index:idx_name,unique"`
	Age  int
}

type Person1 struct {
	Mode1 `gorm:"embedded;embeddedPrefix:u_"`
	Name  string `gorm:"default:lisi"`
}

type Mode1 struct {
	Uuid string `gorm:"primaryKey"`
}

type UserInfo struct {
	Name string
	Uuid string `gorm:"embedded;embeddedPrefix:u_"`
}

func main() {
	db := GetDb()
	uuid, _ := uuid.GenerateUUID()
	db.AutoMigrate(&Person1{})
	aa := []Person1{{Mode1: Mode1{Uuid: uuid + "1"}, Name: "lisi"}, {Mode1: Mode1{Uuid: uuid + "2"}, Name: "lisi"}, {Mode1: Mode1{Uuid: uuid + "3"}, Name: "lisi"}}
	dbres := db.Create(&aa)
	fmt.Println(dbres.RowsAffected)

	//假如需求出现只想创建单个字段
	db.Select("name").Create(&Person1{Name: "22222"})
	//or
	db.Omit("name").Create(&Person1{Name: "22222"})
	//V2 查询
	var person1 []Person1
	//cc  :=  make(map[string]interface{})
	errorDb := db.Model(&Person1{}).Debug().Find(&person1, 5000)
	fmt.Println(errors.Is(errorDb.Error, gorm.ErrRecordNotFound))

	var u []UserInfo
	db.Model(&Person1{}).Debug().Find(&u)
	fmt.Println(u)
	/**
	  update :只更新选择字段
	  updates: 更新所有字段 ，一种map 一种结构体 struct ，结构体零值不参与更新
	  sava :无论如何都更新，包括零值（根据主键更新，如果没有则会创建）
	*/
	dupdate := db.Model(&Person1{}).Debug().Find(&person1)
	for k := range person1 {
		person1[k].Name = "iiiii"
	}
	dupdate.Debug().Save(&person1)
	//.Where("u_uuid= ?","0a534291-544e-f0d2-2f60-0f7e3c2996f52")
	/*	model := []interface{}{
			&Person{},
			&Person1{},
		}
		fmt.Println(model)

		fmt.Println(db.Debug().Migrator().HasTable(&Person{}))
		//if db.Migrator().HasTable(&Person{}) {
		//	db.Migrator().RenameTable(&Person{},&Person1{})
		//}else{
		//	db.Migrator().RenameTable(&Person1{},&Person{})
		//}

		db.Migrator().AddColumn(&Person{},"Age")
		fmt.Println(db.Migrator().CurrentDatabase())
		//db.Debug().AutoMigrate(model ...)
		// 获取字段类型
		//db.Migrator().ColumnTypes(&Person{}) ([]*sql.ColumnType, error)
		if db.Migrator().HasConstraint(&Person{}, "name_checker") {
			db.Migrator().CreateConstraint(&Person{},"name_checker")
		}else{
			//db.Migrator().DropConstraint(&Person{},"name_checker")
		}
		if db.Migrator().HasIndex(&Person{},"idx_name") {
			db.Migrator().CreateIndex(&Person{},"idx_name")
		}else{
			//db.Migrator().DropIndex(&Person{},"idx_name")
		}*/

}
